global ring3_init


extern pagina_libre_usuario
extern mapear_pagina

ring3_page equ 0x66666000

mi_tss:
	times 104 db 0

extern gdt
; void ring3_init(void)
ring3_init:
	xchg bx,bx

	;jmp DWORD 0x0023:ring3_task

	mov eax, mi_tss ; Direccion de la TSS

	mov DWORD [eax + 4], esp  ; esp0 = esp
	mov  WORD [eax + 8], 0x10 ; ss0 = Sel Datos nivel 0

	mov WORD [gdt+9*8+0], 104 ; Limit = 104
	mov DWORD [gdt+9*8+4], eax ; Base_24_31
	mov DWORD [gdt+9*8+2], eax ; Base_0_15 y 16_23
	mov WORD [gdt+9*8+5], 0x0089; ATTR+TYPE

	mov ax, 9*8
	ltr ax      ; Carga el selector de TSS en LTR

	; Necesito una página para la tarea de anillo 3
	call pagina_libre_usuario
	mov ebx, eax
	; void mapear_pagina(unsigned int virtual, unsigned int* cr3, unsigned int fisica, unsigned int attributos)
	push DWORD 0x007
	push eax
	mov eax, cr3
	push eax
	push ring3_page
	call mapear_pagina
	add esp, 16

	xchg bx,bx

	; ebx = fisica
	mov edi, ebx
	mov esi, ring3_task
	mov ecx, ring3_task_len
	rep movsb

	push DWORD 0x2B
;	push DWORD 0x1234
	push DWORD ring3_page+0x1000
	pushfd
	push DWORD 0x23
	push DWORD ring3_page
	iret ; Salta a ring3_task en CPL=3

; Contador en la pila
;ring3_task:
;	xchg bx,bx
;	mov ebp, esp
;	push DWORD 0 ; Inicia en 0
;.ciclo:
;	inc DWORD [ebp-4]
;	jmp .ciclo


; Contador como variable global
VAR_CONT equ ring3_page+(ring3_task.contador-ring3_task)
ring3_task:
	jmp .sigue
.contador:
	dd 0
.sigue:
	xchg bx,bx
	mov ax, 0x2B
	mov ds, ax
.ciclo:
	inc DWORD [VAR_CONT]
	
;	xor edx, edx
;	mov eax, [VAR_CONT]
;	mov ecx, 10
;	div ecx
;	mov dh, 0x0B ; Amarillo
;	; Fila 4, Columna 70
;	mov [0xB8000 + 160*4 + 2*70], dx

; Para el taller:
	mov eax, [VAR_CONT]
	int 0x66

	jmp .ciclo
ring3_task_len equ $ - ring3_task

